package com.liu.jbase.service.mongo;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.mongodb.core.mapreduce.GroupBy;
import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import com.liu.jbase.PageListVo;

/**
 * @date 2017年5月13日
 * @time 下午5:16:38
 * @author liuxingmi
 * @desc 
 * @param <T>
 */
public interface IMongoClient<T> {

    /**
     * 保存数据
     * 
     * @param entity
     */
    public void insert(T entity) throws Exception;

    /**
     * 更新数据
     * 
     * @param entity
     */
    public void update(T entity) throws Exception;

    /**
     * 根据ID更新数据
     * 
     * @param id
     * @param key
     * @param value
     */
    public void updateById(Serializable id, String key, String value, Class<T> entity) throws Exception;

    /**
     * 更加条件更新数据
     * 
     * @param query
     * @param key
     * @param value
     */
    public void update(Query query, Update update, Class<T> entity) throws Exception;

    /**
     * @author liuxingmi
     * @datetime 2017年7月3日 下午10:01:16
     * @desc 查询病更新数据
     * @param query
     * @param update
     * @param entity
     * @throws Exception T
     */
    public T findAndUpdate(Query query, Update update, Class<T> entity) throws Exception;
    
    /**
     * 更加条件更新数据
     * 
     * @param query
     * @param key
     * @param value
     */
    public void update(Query query, String key, String value, Class<T> entity) throws Exception;

    /**
     * 根据ID删除数据
     * 
     * @param id
     */
    public void deleteById(Serializable id, Class<T> entity) throws Exception;

    /**
     * 根据条件删除数据
     * 
     * @param query
     */
    public void deleteByQuery(Query query, Class<T> entity) throws Exception;

    /**
     * 根据ID查询数据
     * 
     * @param id
     * @return
     */
    public T getOneById(Serializable id, Class<T> entity) throws Exception;

    /**
     * 根据query查询数据
     * 
     * @param id
     * @return
     */
    public T getOne(Query query, Class<T> entity) throws Exception;

    /**
     * 获取所有数据
     * 
     * @return
     */
    public List<T> getAll(Class<T> entity) throws Exception;

    /**
     * 获取所有数据
     * 
     * @return
     */
    public List<T> getAll(Query query, Class<T> entity) throws Exception;

    /**
     * 根据条件获取总数
     * 
     * @param query
     * @return
     */
    public long getCount(Query query, Class<T> entity) throws Exception;
    
    public GroupByResults<T> group(Criteria criteria, String inputCollectionName, GroupBy groupBy, Class<T> entity) throws Exception;

    /**
     * 根据条件查询分页
     * 
     * @param query
     * @param page
     * @return
     */
    public PageListVo<T> getPage(Query query, PageListVo<T> page, Class<T> entity) throws Exception;

}
